#include "seqlist.h"

// 基本API
struct seqlist * init_list(int cap)
{
    struct seqlist *sl = calloc(1, sizeof(struct seqlist));

    if(sl != NULL)
    {
        sl->data = calloc(cap, sizeof(int));
        if(sl->data == NULL)
        {
            free(sl);
            return NULL;
        }
        sl->capacity = cap;
        sl->last = -1;
    }

    return sl;
}

bool is_full(struct seqlist *sl)
{
    return sl->last == sl->capacity-1;
}

bool add_list(int newdata, struct seqlist *sl)
{
    // 顺序表已满，直接返回错误
    if(is_full(sl))
    {
        printf("顺序表已满\n");
        return false;
    }

    // 将数据整体往后移动一位
    for(int i=sl->last; i>=0; i--)
        sl->data[i+1] = sl->data[i];

    // 将新数据添加到开头
    sl->data[0] = newdata;

    // 更新最后一个元素的下标
    sl->last++;

    return true;
}

bool is_empty(struct seqlist *sl)
{
    return sl->last == -1;
}

void show(struct seqlist *sl)
{
    if(is_empty(sl))
        return;

    for(int i=0; i<=sl->last; i++)
        printf("%d\t", sl->data[i]);
    printf("\n");
}

// 彻底销毁所有数据结构
struct seqlist *destroy(struct seqlist *sl)
{
    if(sl != NULL)
        free(sl->data);
    free(sl);
    return NULL;
}

// 销毁顺序表，保留管理结构体
// 即使sl恢复初始化状态
struct seqlist *destroy_init(struct seqlist *sl)
{
    sl->last = -1;
    return sl;
}

// 优点：
// 支持下标直接访问，即 data[i]
// 数据节点有效存储比例大，即节点中没有占用多余内存去表达逻辑

// 缺点：
// 需要一片连续的内存
// 需要成片移动数据